package com.pig4cloud.pig.auth.support.core;

import com.pig4cloud.pig.common.core.constant.SecurityConstants;
import com.pig4cloud.pig.common.security.service.PigUser;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsSet;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;

/**
 * OAuth2 令牌自定义增强实现类
 * <p>
 * 该类用于在 OAuth2 令牌生成过程中添加自定义的声明（claims）。
 * 主要功能：
 * 1. 添加系统许可证信息
 * 2. 添加客户端 ID
 * 3. 添加用户详细信息（用户 ID、用户名、完整用户对象）
 * 
 * 注意：客户端模式（client_credentials）不返回具体用户信息
 *
 * @author lengleng
 * @date 2025/05/30
 */
public class CustomeOAuth2TokenCustomizer implements OAuth2TokenCustomizer<OAuth2TokenClaimsContext> {

	/**
	 * 自定义 OAuth 2.0 Token 属性
	 * <p>
	 * 在生成令牌时调用，可以向令牌中添加额外的声明信息。
	 * 这些信息将被编码到 JWT 令牌中，便于资源服务器解析和使用。
	 * 
	 * @param context 包含 OAuth 2.0 Token 属性的上下文，可获取授权类型、用户信息等
	 */
	@Override
	public void customize(OAuth2TokenClaimsContext context) {
		OAuth2TokenClaimsSet.Builder claims = context.getClaims();
		
		// 添加系统许可证信息，标识令牌所属系统
		claims.claim(SecurityConstants.DETAILS_LICENSE, SecurityConstants.PROJECT_LICENSE);
		
		// 添加客户端 ID，方便资源服务器识别调用方
		String clientId = context.getAuthorizationGrant().getName();
		claims.claim(SecurityConstants.CLIENT_ID, clientId);
		
		// 客户端模式不需要返回具体用户信息
		// 因为客户端模式是机器对机器的认证，没有用户参与
		if (SecurityConstants.CLIENT_CREDENTIALS.equals(context.getAuthorizationGrantType().getValue())) {
			return;
		}

		// 对于其他授权模式（如密码模式、短信模式等），添加用户信息
		PigUser pigUser = (PigUser) context.getPrincipal().getPrincipal();
		claims.claim(SecurityConstants.DETAILS_USER, pigUser);  // 完整的用户对象
		claims.claim(SecurityConstants.DETAILS_USER_ID, pigUser.getId());  // 用户 ID
		claims.claim(SecurityConstants.USERNAME, pigUser.getUsername());  // 用户名
	}

}
